﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.DataTypes;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using ComunesMGI.Excepciones;

namespace MGI.AccesoDatos.AccesoBD
{
    class BDUsuarios
    {
        public List<DataUsuario> GetUsuarios()
        {
            string nombre = "";
            int codigo = 0;

            List<DataUsuario> listaUsuarios = new List<DataUsuario>();
            string textoConeccion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConeccion);

            string consulta = "Exec GetUsuarios";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();

                while (lector.Read())
                {
                    nombre = (string)lector["UsrNom"];
                    codigo = (int)lector["UsrCod"];
                    DataUsuario usuario = new DataUsuario(nombre,codigo);
                    listaUsuarios.Add(usuario);
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return listaUsuarios;
        }


        public void AddUsuario(DataUsuario usuario)
        { 
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            string textoComando = "AgregarUsuario";
            SqlCommand cmd = new SqlCommand(textoComando, cnn);
            int exito = -1;
            try
            {
                //obtenemos le estado inicial, con el que se dara de alta el wp
                cnn.Open();
                
                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter nombre = new SqlParameter("@UsrNom", usuario.Nombre);

                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(nombre);
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                exito = (int)cmd.Parameters["@retorno"].Value;

                if (exito == 0)
                {
                    throw new YAExisteRegistroException("Ya existe un usuario con ese nombre");
                }
                else if (exito == -1)
                {
                    throw new Exception("Problemas en la base de datos");
                }

            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }

        }

        public void ModificarUsuario(DataUsuario usuario)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            int afectados = -1;
            try
            {
                string textoComando = "ModificarUsuario";
                SqlCommand cmd = new SqlCommand(textoComando, cnn);
                cnn.Open();

                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter codUsuario = new SqlParameter("@UsrCod", usuario.Codigo);
                SqlParameter nomUsuario = new SqlParameter("@UsrNom", usuario.Nombre);
                SqlParameter fechaSincronizacion = new SqlParameter("@FechaSincronizacion", usuario.FechaSincronizacion);
                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(codUsuario);
                cmd.Parameters.Add(nomUsuario);
                cmd.Parameters.Add(fechaSincronizacion);

                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                afectados = (int)cmd.Parameters["@retorno"].Value;

                if (afectados == 0)
                {
                    throw new NoExisteRegistroException("No existe el usuario con dicho codigo");
                }
                else if (afectados == -1)
                {
                    throw new Exception("Problemas en la base de datos");
                }
                else if (afectados == -2)
                {
                    throw new YAExisteRegistroException("Ya existe un usuario con ese nombre");
                }

            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }
        }

        public void BajaUsuario(int usrCod)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            string textoComando = "EliminarUsuario";
            SqlCommand cmd = new SqlCommand(textoComando, cnn);

            int error = -1;
            try
            {
                cnn.Open();

                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter codigo= new SqlParameter("@UsrCod", usrCod);

                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(codigo);
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                error = (int)cmd.Parameters["@retorno"].Value;

                if (error == 0)
                {
                    throw new YAExisteRegistroException("No existe un usuario con ese codigo");
                }
                else if (error == -1)
                {
                    throw new Exception("Problemas en la base de datos al eliminar usuario");
                }

            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }
        }

        public DataUsuario GetUsuarioPorNombre(string nomUsuario)
        {
            DataUsuario usuario = null;
            int codUsuario = -1;
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetUsuarioPorNombre";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@UsrNom", nomUsuario);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();

                if (lector.Read())
                {
                    codUsuario = (int)lector["UsrCod"];
                    DateTime fechaSincronizacion = (DateTime)lector["FechaSincronizacion"];
                    string nomUsuarioBD = (string)lector["UsrNom"];
                    usuario = new DataUsuario(nomUsuarioBD, codUsuario, fechaSincronizacion);


                }
                else
                {
                    throw new Exception("No existe el usuario de nombre: " + nomUsuario);
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return usuario;
        }

        public DataUsuario GetUsuario(int codUsuario)
        {
            DataUsuario usuario = null;
            string nomUsuario = null;
             
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetUsuario";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@UsrCod", codUsuario);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();

                if (lector.Read())
                {
                    nomUsuario = (string)lector["UsrNom"];
                    DateTime fechaSincronizacion = (DateTime)lector["FechaSincronizacion"];
                    usuario = new DataUsuario( nomUsuario, codUsuario,fechaSincronizacion);


                }
                else
                {
                    throw new Exception("No existe el usuario de nombre: " + nomUsuario);
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return usuario;
        }
    }
}
